﻿using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using System.Web.Mvc;
using System.Web.Script.Serialization;
using WebPrestamoBiblioteca.Dominio;
using WebPrestamoBiblioteca.Tools;
using System.Messaging;
using System;


namespace WebPrestamoBiblioteca.Controllers
{
    public class SolicitudController : Controller
    {
        private SOAPPrestamos.PrestamoServiceClient proxy = new SOAPPrestamos.PrestamoServiceClient();
        public ActionResult Solicitar()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Solicitar(Solicitud model)
        {
            try
            {
                Solicitud solicita=new Solicitud
                {
                    IdPublicacion=model.IdPublicacion,
                    NuDias=model.NuDias,
                    NuDocumento=model.NuDocumento
                };
                string posdata = solicita.ToJSON();
                byte[] data = Encoding.UTF8.GetBytes(posdata);
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:29818/SolicitudService.svc/Solicitudes");
                req.Method = "POST";
                req.ContentLength = data.Length;
                req.ContentType = "application/json";
                using (Stream reqStream = req.GetRequestStream())
                {
                    reqStream.Write(data, 0, data.Length);
                }
                HttpWebResponse res = null;
                res = (HttpWebResponse)req.GetResponse();
                StreamReader reader = new StreamReader(res.GetResponseStream());
                string solicitudjson = reader.ReadToEnd();
                JavaScriptSerializer js = new JavaScriptSerializer();
                Solicitud Solicitudcreado = js.Deserialize<Solicitud>(solicitudjson);
                TempData["mensaje"] = "Su solicitud es la Numero Nº" + Solicitudcreado.IdSolicitud.ToString();
                return View("Registrado");
            }
            catch (WebException e)
            {
                if (e.Response != null)
                {
                    HttpWebResponse resError = (HttpWebResponse)e.Response;
                    StreamReader reader2 = new StreamReader(resError.GetResponseStream());
                    string error = reader2.ReadToEnd();
                    JavaScriptSerializer js = new JavaScriptSerializer();
                    Error errorMessage = js.Deserialize<Error>(error);
                    TempData["mensaje"] = errorMessage.CodError + " " + errorMessage.MesError;
                }
                else
                {
                    string rutacola = @".\private$\BibliotecaPublicaSolicitud";
                    if (!MessageQueue.Exists(rutacola))
                        MessageQueue.Create(rutacola);
                    MessageQueue cola = new MessageQueue(rutacola);
                    Message mensaje = new Message();
                    mensaje.Label = "Solicitud de Publicacion";
                    mensaje.Body = new Solicitud() 
                    { 
                        IdPublicacion=model.IdPublicacion,
                        NuDias=model.NuDias,
                        NuDocumento=model.NuDocumento
                    };
                    cola.Send(mensaje);
                    TempData["mensaje"] = "Su solicitud fue recibida y sera procesada lo mas pronto posible!!!";
                    
                }
                return View();
            }
        }
        public ActionResult Pendientes()
        {
            try
            {
                HttpWebRequest req2 = (HttpWebRequest)WebRequest.Create("http://localhost:29818/SolicitudService.svc/Solicitudes/Pendientes");
                req2.Method = "GET";
                HttpWebResponse res2 = (HttpWebResponse)req2.GetResponse();
                StreamReader reader2 = new StreamReader(res2.GetResponseStream());
                string alumnojson2 = reader2.ReadToEnd();
                JavaScriptSerializer js2 = new JavaScriptSerializer();
                List<Prestamo> prestamosobtenidos = js2.Deserialize<List<Prestamo>>(alumnojson2);
                return View(prestamosobtenidos);
            }
            catch (WebException e)
            {
                HttpWebResponse resError = (HttpWebResponse)e.Response;
                StreamReader reader2 = new StreamReader(resError.GetResponseStream());
                string error = reader2.ReadToEnd();
                JavaScriptSerializer js = new JavaScriptSerializer();
                Error errorMessage = js.Deserialize<Error>(error);
                TempData["mensaje"] = errorMessage.CodError + " " + errorMessage.MesError;
                return View();
            }
        }
        public ActionResult ProcesarColas()
        {
            return View();
        }

        [HttpPost]
        public ActionResult ProcesarColas(string model)
        {
            try
            {
                HttpWebRequest req2 = (HttpWebRequest)WebRequest.Create("http://localhost:29818/SolicitudService.svc/Solicitudes");
                req2.Method = "POST";
                req2.ContentLength = 0;
                req2.ContentType = "text/htm";
                Stream reqStream = req2.GetRequestStream();
                string rutacola = @".\private$\BibliotecaPublicaSolicitud";
                if (MessageQueue.Exists(rutacola))
                {
                    MessageQueue cola = new MessageQueue(rutacola);
                    int a = cola.GetAllMessages().Length;
                    if (a > 0)
                    {
                        Solicitud solicita = new Solicitud();
                        reqStream = null;
                        for (int i = 1; i <= a; i++)
                        {
                            try
                            {
                                cola.Formatter = new XmlMessageFormatter(new Type[] { typeof(Solicitud) });
                                Message mensaje = cola.Receive();
                                solicita = (Solicitud)mensaje.Body;
                                string posdata = solicita.ToJSON();
                                byte[] data = Encoding.UTF8.GetBytes(posdata);
                                HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:29818/SolicitudService.svc/Solicitudes");
                                req.Method = "POST";
                                req.ContentLength = data.Length;
                                req.ContentType = "application/json";
                                using (reqStream = req.GetRequestStream())
                                {
                                    reqStream.Write(data, 0, data.Length);
                                }
                                HttpWebResponse res = null;
                                res = (HttpWebResponse)req.GetResponse();
                                StreamReader reader = new StreamReader(res.GetResponseStream());
                                string solicitudjson = reader.ReadToEnd();
                                JavaScriptSerializer js = new JavaScriptSerializer();
                                Solicitud Solicitudcreado = js.Deserialize<Solicitud>(solicitudjson);
                            }
                            catch (Exception e)
                            { 
                            
                            }
                        }
                        TempData["mensaje"] = "Se proceso las solicitudes en cola. ";
                    }
                    else
                    {
                        TempData["mensaje"] = "No hay solicitudes en cola por procesar.";
                    }
                }
                else
                {
                    TempData["mensaje"] = "No existe cola de solicitudes a procesar.";
                }
                return View();
            }
            catch(WebException e)
            {
                TempData["mensaje"] = "Sucedio un error desconocido!!!."+e.Message;
                return View();
            }
        }

        public ActionResult Seleccionado(int id)
        {
            SOAPPrestamos.Prestamo prestamoBuscado = proxy.ObtenerPrestamo(id);
            return View(prestamoBuscado);
        }

        [HttpPost]
        public ActionResult Seleccionado(Prestamo model)
        {
            if(model.DeSituacion!="Seleccione")
            {
                if (model.DeSituacion == "Aprobada")
                {
                    SOAPPrestamos.Prestamo solicitudevaluada = proxy.AprobarPrestamo(model.IdPrestamo);
                    TempData["mensaje"] = "Se Aprobo Prestamo.";
                }
                else
                {
                    SOAPPrestamos.Prestamo solicitudevaluada = proxy.ObtenerPrestamo(model.IdPrestamo);
                    solicitudevaluada.TxObservacion=model.TxObservacion;
                    proxy.DenegarPrestamo(solicitudevaluada);
                    TempData["mensaje"] = "Se Deniega Prestamo.";
                }
                return View("Prestado"); 
            }
            else
            {
                TempData["mensaje"] = "Elija si Aprueba o Deniega Prestamo.";
                return View(); 
           }
        }
    }
}
